正式開啟『 優雅的 Ruby 』的學習模式!
上回提到我們要用這本書來快樂學習,
透過重構的技巧進行修改、維護我們的程式碼。
重構是指對軟體代碼進行更動以增加可讀性或者簡化結構,但是不影響功能和輸出結果。
重點來了,
進行重構前必須先完成程式語言。
所以;你需要先學好如何把你的每段 Code 依照邏輯、根據、方法呈現等『方法』 進行整理,
才能執行重構。
最常用以下四種的歸類方法:
輸入處理 (collecting input);
功能實現 (performing work);
輸出處理 (delivering output);
失敗處理 (handling failures);
其他方法如診斷(diagnostics)、清理(cleanup),為特殊背景下使用,但請先記住。(未來文章介紹)
(此段模擬於 Ruby 一書經典範例)
def location(item, value)
sub_ttile = get_sub_ttile(item, value)
if(sub_ttile.length==0)
raise BobArticle::AnalysisError, "The '#{item,to_s}''#{value,to_s}'does not have any rows in the analysis table"
else
first_row = sub_table[0]
case item
when :class
BobArticle::Location.get(first_row.file_path, first_row.class_name,nil)
when :method
BobArticle::Location.get(first_row.file_path, first_row.class_name, first_row.method_name)
when :file
BobArticle::Location.get(first_row.file_path, fnil, nil)
else
raise ArgumentError, "Item must be :class, :method, or :file"
end
end
end
這裡不急探討這code的目的是什麼,先套入上述四個歸類方法進行拆分,
先學會分析、歸類再與結果呈現進行比對。
首先;
這是取得『輸入』:
sub_ttile = get_sub_ttile(item,value)
若發生錯誤、數據不存在時,則拋出異常:
if(sub_ttile.length==0)
raise BobArticle::AnalysisError,"The '#{item,to_s}''#{value,to_s}'does not have any rows in the analysis table"
若數據在,則直接獲取數據:
else
first_row = sub_table[0]
該方法的核心功能:
case item
when :class
BobArticle::Location.get(first_row.file_path,first_row.class_name,nil)
when :method
BobArticle::Location.get(first_row.file_path,first_row.class_name,first_row.method_name)
when :file
BobArticle::Location.get(first_row.file_path,fnil,nil)
最後的失敗處理:
else
raise ArgumentError,"Item must be :class, :method, or :file"
比照最初;
def location(item,value)
sub_ttile = get_sub_ttile(item,value) #輸入處理
--------------------------------------------------
if(sub_ttile.length==0)
、、、
else #失敗處理
--------------------------------------------------
first_row = sub_table[0]
case item
when :class
、、、
when :method
、、、
when :file
、、、 #功能實現
--------------------------------------------------
else
、、、
end
end
end
上述表達衍生出的問題就是:
else (第6行) end (第20行) 變成是異常處理。表示如果沒有異常的情下,這段 if 的程式碼外層的 else、 end 是沒有意義的。
功能分類相雜,雖有輸入處理、失敗處理、功能實現、異常處理但不同部分參雜一起容易模糊重點分析。
練習使用歸納方式整理程式碼,如同我們在栽植一樣的細心呵護~
讓我們重新整理順序:
易於理解和維護、更少的bug 且能更靈活的適應需求變化,找回初衷。
好的故事表達帶你上天堂,
越能符合語意的目的,表示我們離資優生筆記更近一點!
那今天就先學習到這,
但務必牢記四個歸類方法,不論是今後鐵人文章用還是永久的學習!
我們絕對都會經常不斷地重複使用到、甚至當作練習的基礎。
您好,想請問這段
def location(item, value)
sub_ttile = get_sub_ttile(item, value)
if(sub_ttile.length==0)
raise BobArticle::AnalysisError, "The '#{item,to_s}''#{value,to_s}'does not have any rows in the analysis table"
else
first_row = sub_table[0]
case item
when :class
BobArticle::Location.get(first_row.file_path, first_row.class_name,nil)
when :method
BobArticle::Location.get(first_row.file_path, first_row.class_name, first_row.method_name)
when :file
BobArticle::Location.get(first_row.file_path, fnil, nil)
else
raise ArgumentError, "Item must be :class, :method, or :file"
end
end
end
重構完會是什麼樣子呢?
您好!
謝謝您的發問,
這部分後面的章節會再次提到與方法介紹唷~
或是也可以從『 優雅的 Ruby 』 一書找到許多推薦方法:)